#ifndef PLUGINCONVERTOR_H_
#define PLUGINCONVERTOR_H_

//std headers
#include <string>

//boost headers
#include <boost/function.hpp>

//project headers
#include "IConverter.h"
#include "IPlugin.h"

namespace PluginSystem
{

//! PluginConvertor
/*!
	Trieda funguje ako rozhranie medzi systemom a samotnym
	pluginom. Taktiez sluzi na samotne nahranie pluginu do
	pamete. 
*/
class PluginConvertor :	/*public IPlugin,*/ public IConverter
{
	public:
		
		//! Konstruktor
		/*!
			Sluzi na nahratie konkretneho pluginu do pamete 
			\param thePluginPath cesta k pluginu 
		*/
		PluginConvertor(std::string thePluginPath);


		~PluginConvertor(void);

		//! Open
		/*!
			Sluzi na otvorenie dokumentu na konvertovanie.
			Samotny dokument je ulozeny v forme objektu PFileInfo v pameti aplikacie.
			\param theFile objekt obsahujuci dokument na konverziu
			\return true ak sa dokument uspesne otvoril, false inak
		*/
		virtual bool Open(PComunicator::PFileInfo &theFile);


		//! Format
		/*!
			Navrati format dokumentu pre ktory je urceny			
			\return true ak sa dokument uspesne otvoril, false inak
		*/
		virtual std::string Format();


		//! Read
		/*!
			Sluzi na precitanie dokumentu a jeho konverziu na cisty text
			\return std::wstring obsahujuci text dokumentu 
		*/
		virtual std::wstring Read();

		//! CreateHtml
		/*!
			Funkcia sluzi na prekonvertovanie povodneho dokumentu na html stranku
			\param string predstavuje cestu kam sa ma ulozit html stranka
			\return string predstavuje plnu cestu k html stranke
		*/
		virtual std::string CreateHtml(std::string thePath);  


		//! Version (public )
		/*!
		Verzia Pluginu
		\return char* nullterminated pole znakov obsahujuca
		aktualnu verziu Pluginu.
		*/
		virtual char* Version();


		//! Autor (public )
		/*!
		Autor Pluginu
		\return char* nullterminated pole znakov obsahujuca
		meno autora
		*/
		virtual char* Autor();

	private:
		//////////////////////////////////////////////////////////////////////////
		//						MEMBER VARIABLES
		//////////////////////////////////////////////////////////////////////////
		
		/*	!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
			!													!
			! Vsade kde funkcia bere no argument(teda void)		!
			! som void nahradil na char* , jeto !!! HACK !!!	!
			! Neviem preco ale inak to zliha pri kompilacii		!
			! z funkcneho hladiska to funguje :)				!
			!													!
			!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
		*/
		boost::function<bool (PComunicator::PFileInfo&)> *_Open;
		boost::function<char* (char*)> *_Format;
		boost::function<wchar_t* (char*)> *_Read;
		boost::function<char* (const char*)> *_CreateHtml;
		boost::function<char* (char*)> *_Version;
		boost::function<char* (char*)> *_Autor;
}; //PluginConvertor 


}//PluginSystem

#endif //PLUGINCONVERTOR_H_
